package editorarquivobmg.service;

import editorarquivobmg.codificacao.ICodificacao;
import editorarquivobmg.gui.TelaPrincipal;
import editorarquivobmg.model.BmgFile;
import editorarquivobmg.util.CodigoMapeamento;
import editorarquivobmg.util.ConversorTexto;
import editorarquivobmg.util.ManipuladorDados;
import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.table.DefaultTableModel;

public class MapeamentoTextoService {

    private DefaultTableModel modelo = null;
    private ConversorTexto parser = null;

    public MapeamentoTextoService(TelaPrincipal form) {
        instanciarModeloTabela(form);
    }

    public void instanciarArquivoMapeamento(TelaPrincipal form, BmgFile bmgFilePrincipal, BmgFile bmgFileComparacao, ICodificacao codificacao, int index, ManipuladorArquivoService manipuladorArquivo) {
        File arquivo;
        int numeroCodigos;
        ArrayList<CodigoMapeamento> mapeamentos = new ArrayList<CodigoMapeamento>();
        String codigoSubstituicao, codigoHexadecimal;
        int qtdPixel;
        try {
            arquivo = manipuladorArquivo.abrirArquivoMapeamento(form);
            Scanner sc = new Scanner(arquivo);
            numeroCodigos = sc.nextInt();
            for (int i = 0; i < numeroCodigos; i++) {
                codigoHexadecimal = sc.next();
                codigoSubstituicao = sc.next();
                qtdPixel = Integer.parseInt(sc.next());
                CodigoMapeamento mapeamento = new CodigoMapeamento(codigoHexadecimal, codigoSubstituicao, new String(ManipuladorDados.hexStringToByteArray(codigoHexadecimal), codificacao.getCodificacao()), qtdPixel);
                mapeamentos.add(mapeamento);
            }
            parser = new ConversorTexto(mapeamentos);
            if (bmgFilePrincipal != null) {
                form.getTxtMessage().setText(parser.parseOutAllCodes(new String(bmgFilePrincipal.getDataTexto(index), codificacao.getCodificacao())));
            }
            if (bmgFileComparacao != null) {
                form.getTxtMessageComparacao().setText(parser.parseOutAllCodes(new String(bmgFileComparacao.getDataTexto(index), codificacao.getCodificacao())));
            }
            limparTabela(form);
            carregarTabela(form);
        } catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
    }

    private void instanciarModeloTabela(TelaPrincipal form) {
        modelo = new DefaultTableModel(new Object[]{"Código", "Equivalencia"}, 0) {
            @Override
            public boolean isCellEditable(int row, int col) {
                return false;
            }
        };
        form.getTblMapeamento().setModel(modelo);
    }

    private void carregarTabela(TelaPrincipal form) {
        for (int i = 0; i < parser.getNumeroCodigos(); i++) {
            modelo.addRow(new Object[]{parser.getMapeamentos().get(i).getTextoHexadecimal(), parser.getMapeamentos().get(i).getTextoSubstituicao()});
        }
        form.getTblMapeamento().setModel(modelo);
    }

    private void limparTabela(TelaPrincipal form) {
        int qtdLinhas = modelo.getRowCount();
        for (int a = 0; a < qtdLinhas; a++) {
            modelo.removeRow(0);
        }
        form.getTblMapeamento().setModel(modelo);
    }

    public void limparMapeamento(TelaPrincipal form, BmgFile bmgFilePrincipal, BmgFile bmgFileComparacao, ICodificacao codificacao, int index) {
        try {
            limparTabela(form);
            parser = null;
            if (bmgFilePrincipal != null) {
                form.getTxtMessage().setText(new String(bmgFilePrincipal.getDataTexto(index), codificacao.getCodificacao()));
            }
            if (bmgFileComparacao != null) {
                form.getTxtMessageComparacao().setText(new String(bmgFileComparacao.getDataTexto(index), codificacao.getCodificacao()));
            }
        } catch (Exception ex) {
            System.err.println(ex.getMessage());
        }
    }

    public ConversorTexto getParser() {
        return parser;
    }
}
